package mx.ipn.persistencia.mysql;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

import mx.ipn.persistencia.FabricaDeDAOs;
import mx.ipn.persistencia.dao.HorarioDAO;
import mx.ipn.persistencia.dao.TurnoDAO;
import mx.ipn.to.TurnoTO;
import mx.ipn.to.HorarioTO;
import mx.ipn.to.FechaHoraTO;

public class HorarioDAOMySQL implements HorarioDAO {
	static {
		FabricaDeDAOsMySQL.iniciaLog(HorarioDAOMySQL.class);
	}

	private static final String INSERT = "INSERT INTO horario (fecha_inicio,fecha_termino,id_turno) VALUES(?,?,?)";
	private static final String DELETE = "DELETE FROM horario WHERE id_horario=?";
	private static final String UPDATE = "UPDATE horario SET fecha_inicio=?,fecha_termino=?,id_turno=? WHERE id_horario=?";
	private static final String FINDBYID = "SELECT * FROM horario WHERE id_horario=?";
	private static final String SELECT = "SELECT * FROM horario";
	private static final String SELECTBYRANGOINICIO = "SELECT * FROM horario WHERE fecha_inicio>=? AND fecha_inicio<=?";
	private static final String SELECTBYTURNO = "SELECT * FROM horario WHERE id_turno=?";

	@Override
	public short deleteHorario(int idHorario) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(DELETE);

			ps.setInt(1, idHorario);

			ps.executeUpdate();
			if (ps.getUpdateCount() == 0) {
				ps.close();
				conexion.close();
				return 0;
			} else {
				ps.close();
				conexion.close();
				return 1;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return (short) -1;
		}
	}

	@Override
	public HorarioTO findHorarioById(int idHorario) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(FINDBYID);

			ps.setInt(1, idHorario);

			ResultSet rs = ps.executeQuery();

			if (rs.next()) {

				// Crea la fabrica especifica de MySQL
				FabricaDeDAOs fabricaMySQL = FabricaDeDAOs
						.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);
				// Crea un DAO para la tabla Cliente
				TurnoDAO turnoDAO = fabricaMySQL.getTurnoDAO();
				TurnoTO turnoTO = new TurnoTO();

				turnoTO = turnoDAO.findTurnoById(rs.getInt("id_turno"));

				HorarioTO horarioTO = new HorarioTO(idHorario, rs
						.getDate("fecha_inicio"), rs.getDate("fecha_termino"),
						turnoTO);

				ps.close();
				conexion.close();
				return horarioTO;
			}

			ps.close();
			conexion.close();
			return null;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public int insertHorario(HorarioTO horarioTO) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(INSERT);

			ps.setDate(1, FechaHoraTO.getFecha(horarioTO.getFechaInicio()));
			ps.setDate(2, FechaHoraTO.getFecha(horarioTO.getFechaTermino()));
			ps.setInt(3, horarioTO.getTurnoTO().getIdTurno());
			ps.executeUpdate();

			// atrapa el indice del campo agregado
			int autoIncIndice = -1;
			ResultSet rs = ps.getGeneratedKeys();

			if (rs.next()) {
				autoIncIndice = rs.getInt(1);
			} else {
				System.err.print("No se pudo agregar campo");
				return 0;
			}

			ps.close();
			conexion.close();

			return autoIncIndice;
		} catch (Exception e) {
			e.printStackTrace();
			return -1;
		}
	}

	@Override
	public ArrayList<HorarioTO> selectHorario() {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			FabricaDeDAOs fabricaMySQL = null;

			TurnoDAO turnoDAO = null;

			ArrayList<HorarioTO> horarioTO = null;
			HorarioTO horarioTO2 = null;

			PreparedStatement ps = conexion.prepareStatement(SELECT);

			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (horarioTO == null) {
					horarioTO = new ArrayList<HorarioTO>();
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					turnoDAO = fabricaMySQL.getTurnoDAO();
				}

				int idHorario = rs.getInt("id_horario");
				java.sql.Date fechaInicio = rs.getDate("fecha_inicio");
				java.sql.Date fechaTermino = rs.getDate("fecha_termino");
				TurnoTO turnoTO = turnoDAO.findTurnoById(rs.getInt("id_turno"));
				horarioTO2 = new HorarioTO(idHorario, fechaInicio,
						fechaTermino, turnoTO);

				horarioTO.add(horarioTO2);
			}
			ps.close();
			conexion.close();
			return horarioTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public ArrayList<HorarioTO> selectHorarioByRangoInicio(Date inicio, Date fin) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			FabricaDeDAOs fabricaMySQL = null;

			TurnoDAO turnoDAO = null;

			ArrayList<HorarioTO> horarioTO = null;
			HorarioTO horarioTO2 = null;

			PreparedStatement ps = conexion
					.prepareStatement(SELECTBYRANGOINICIO);
			ps.setDate(1, inicio);
			ps.setDate(2, fin);
			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (horarioTO == null) {
					horarioTO = new ArrayList<HorarioTO>();
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					turnoDAO = fabricaMySQL.getTurnoDAO();
				}

				horarioTO2 = new HorarioTO(rs.getInt("id_horario"), rs
						.getDate("fecha_inicio"), rs.getDate("fecha_termino"),
						turnoDAO.findTurnoById(rs.getInt("id_turno")));

				horarioTO.add(horarioTO2);
			}
			ps.close();
			conexion.close();
			return horarioTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public HorarioTO selectHorariobyTurno(int idTurno) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			FabricaDeDAOs fabricaMySQL = null;

			TurnoDAO turnoDAO = null;

			ArrayList<Integer> listIdHorario = null;
			ArrayList<java.sql.Date> listFechaInicio = null;
			ArrayList<java.sql.Date> listFechaTermino = null;

			HorarioTO horarioTO = null;

			PreparedStatement ps = conexion.prepareStatement(SELECTBYTURNO);
			ps.setInt(1, idTurno);
			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listIdHorario == null) {

					listIdHorario = new ArrayList<Integer>();
					listFechaInicio = new ArrayList<java.sql.Date>();
					listFechaTermino = new ArrayList<java.sql.Date>();
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					turnoDAO = fabricaMySQL.getTurnoDAO();
				}

				listIdHorario.add(rs.getInt("id_horario"));
				listFechaInicio.add(rs.getDate("fecha_inicio"));
				listFechaTermino.add(rs.getDate("fecha_termino"));
			}
			if (listIdHorario != null) {

				Integer[] arrIdHorario = (Integer[]) listIdHorario
						.toArray(new Integer[listIdHorario.size()]);
				Date[] arrFechaInicio = (Date[]) listFechaInicio
						.toArray(new Date[listFechaInicio.size()]);
				Date[] arrFechaTermino = (Date[]) listFechaTermino
						.toArray(new Date[listFechaTermino.size()]);

				horarioTO = new HorarioTO(arrIdHorario, arrFechaInicio,
						arrFechaTermino, turnoDAO.findTurnoById(idTurno));
			}
			ps.close();
			conexion.close();
			return horarioTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public short updateHorario(HorarioTO horarioTO) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(UPDATE);
			ps.setDate(1, FechaHoraTO.getFecha(horarioTO.getFechaInicio()));
			ps.setDate(2, FechaHoraTO.getFecha(horarioTO.getFechaTermino()));
			ps.setInt(3, horarioTO.getTurnoTO().getIdTurno());

			ps.setInt(4, horarioTO.getIdHorario());
			ps.executeUpdate();

			if (ps.getUpdateCount() == 0) {
				ps.close();
				conexion.close();
				return 0;
			} else {
				ps.close();
				conexion.close();
				return 1;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return (short) -1;
		}
	}
}
